package com.chenjt.juc.five_interrupt;

import java.util.concurrent.TimeUnit;

/**
 * 注释：
 *
 * @author chenjt
 * @date 2024/7/8 10:20
 */
public class InterruptDemo3 {

    /**
     * 1. 中断标志位，默认false
     * 2. t2 ----> t1发出了中断协商，t2调用t1.interrupt()，中断标志位true
     * 3. 中断标志位true，正常情况，程序停止
     * 4. 中断标志位true，异常情况，InterruptedException，将会把中断状态清除，
     *  并且将收到InterruptedException。中断标志位false导致无线循环
     *
     * 5. 在catch块中，需要再次给中断标志位设置为true，2次调用停止程序才OK
     */
    public static void main(String[] args) {

        Thread t1 = new Thread(()->{
            while (true){

                if(Thread.currentThread().isInterrupted()){
                    System.out.println(Thread.currentThread().getName() + "\t" +
                            "中断标志位：" + Thread.currentThread().isInterrupted() + " 程序停止");
                    break;
                }

                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    // t2线程修改t1线程中断标志位时，会报InterruptedException，且会导致t1线程无线循环
                    // 解决方法：当报InterruptedException时，将线程interrupt标志位重新设置为true
                    Thread.currentThread().interrupt();
                    e.printStackTrace();
                }
                System.out.println("------hello InterruptDemo3");

            }
        },"t1");
        t1.start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(()->t1.interrupt(),"t2").start();

    }


}
